#pragma once

#include "GerenciadorMonstros.h"
#include "Player.h"
#include "Gerenciador_Explosoes.h"

/**
 * Fisica
 */
class Fisica{
private:
	s16 x1;
	s16 y1;
	s16 x2;
	s16 y2;

	s16 h1;
	s16 w1;
	s16 h2;
	s16 w2;
	s16 hitCount;

public:

	Player *player;
	GerenciadorMonstros *gm;
	
	Gerenciador_Explosoes *gexp;

public:
	Fisica(){

		gexp = NULL;
		player = NULL;
		gm = NULL;
	}

	~Fisica(){}
		
	inline void setPointers(Player *player, GerenciadorMonstros *gm, Gerenciador_Explosoes *ge){
		this->player = player;
		this->gm = gm;
		this->gexp = ge;
	}

	inline int testeColisaoTiros(){

		/*
		 * 
		 */
		x1 = 0;
		y1 = 0;
		x2 = 0;
		y2 = 0;
		hitCount = 0;

		h1 = 8;
		w1 = 8;

		h2 = 16;
		w2 = 16;
		for(u8 i=0; i< player->quantidadeTiros; i++){
			
			if(player->getTiro(i)->getEstado() == MORTO)continue;
			for(u8 j=0; j< gm->num_monstros; j++){

				if(gm->getMonstro(j)->getEstado() == MORTO)continue;

				//comparar os dois sprites
				x1 = player->getTiro(i)->getX();
				y1 = player->getTiro(i)->getY();

				x2 = gm->getMonstro(j)->getX();
				y2 = gm->getMonstro(j)->getY();	

				if(x1 <= (x2+w2)){

					if(x1 > x2+w2)continue;
					else if(y1 > y2+h2)continue;
					else if(x1+w1 < x2)continue;
					else if(y1+h1 < y2)continue;

					//importante vir antes. quando mata vai para zona morta.
					gexp->lancar_explosao(
						gm->getMonstro(j)->getX()+8, gm->getMonstro(j)->getY()+8);

					player->getTiro(i)->matar();
					gm->matar_monstro(j);

					hitCount++;
					break;
				}
			}
		}
		return hitCount;
	}

	inline bool testeColisaoInimigo(){
		
		x1 = 0;
		y1 = 0;
		x2 = 0;
		y2 = 0;

		h1 = 32;
		w1 = 32;

		h2 = 16;
		w2 = 16;
		
		// Se estiver morto retorna falso	
		if(player->getEstado() == MORTO)return false;
			
		// Pegar posicao Player
		x1 = player->getX();
		y1 = player->getY();
			
		//Para cada inimigo	
		for(u8 j=0; j< gm->num_monstros; j++){

			// Se estiver morto desconsidera
			if(gm->getMonstro(j)->getEstado() == MORTO)
				continue;
			
			// Pega posicao inimigo
			x2 = gm->getMonstro(j)->getX();
			y2 = gm->getMonstro(j)->getY();

			//Se alguma das comparacoes for verdadeira, nao ha chances de haver colisao.
			if(x1 > x2+w2)continue;
			else if(y1 > y2+h2)continue;
			else if(x1+w1 < x2)continue;
			else if(y1+h1 < y2)continue;

			//importante vir antes. quando mata vai para zona morta.
			gexp->lancar_explosao(
					gm->getMonstro(j)->getX()+8, gm->getMonstro(j)->getY()+8);

			gm->matar_monstro(j);

			return true;

		}
		return false;
	}


};
